Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_local_message_retention.py

Displaying Raw • Download


tests/backend/test_local_message_retention.py v4.6.0-rc.2 (7bbe9846) Text, 6.38 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787time
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMock

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backend Tff7b72import Te6edf3local_message_retention Tff7b72as Te6edf3lmr
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787database Tff7b72import Te6edf3Database
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787provider Tff7b72import Te6edf3DatabaseProvider
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787schema Tff7b72import Te6edf3DatabaseSchema


Tff7b72def Td2a8fftest_normalize_unitTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffnormalize_unitTb4b4b4(Ta5d6ff"Ta5d6ffDAYSTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffUNIT_DAYS
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffnormalize_unitTb4b4b4(Ta5d6ff"Ta5d6ffMonthTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffUNIT_MONTHS
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffnormalize_unitTb4b4b4(Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffUNIT_MONTHS
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffnormalize_unitTb4b4b4(Tff7b72NoneTb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffUNIT_DAYS


Tff7b72def Td2a8fftest_retention_window_secondsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffretention_window_secondsTb4b4b4(T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffdaysTa5d6ff"Tb4b4b4) Tff7b72== T79c0ff86400
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffretention_window_secondsTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffmonthsTa5d6ff"Tb4b4b4) Tff7b72== T79c0ff2 Tff7b72* T79c0ff30 Tff7b72* T79c0ff86400
Tff7b72assert Te6edf3lmrTff7b72.Td2a8ffretention_window_secondsTb4b4b4(T79c0ff20000Tb4b4b4, Ta5d6ff"Ta5d6ffdaysTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffMAX_VALUE_DAYS Tff7b72* T79c0ff86400
Tff7b72assert Tb4b4b4(
Te6edf3lmrTff7b72.Td2a8ffretention_window_secondsTb4b4b4(T79c0ff200Tb4b4b4, Ta5d6ff"Ta5d6ffmonthsTa5d6ff"Tb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffMAX_VALUE_MONTHS Tff7b72* T79c0ff30 Tff7b72* T79c0ff86400
Tb4b4b4)


Tff7b72def Td2a8fftest_local_message_retention_cutoff_tsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= T79c0ff1_000_000.0
Te6edf3c Tff7b72= Te6edf3lmrTff7b72.Td2a8fflocal_message_retention_cutoff_tsTb4b4b4(Te6edf3nowTb4b4b4, T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffdaysTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3c Tff7b72== Te6edf3now Tff7b72- T79c0ff86400.0


Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ff_db_pathTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6fft.dbTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_apply_deletes_and_prunesTb4b4b4(Te6edf3_db_pathTb4b4b4)Tb4b4b4:
Te6edf3provider Tff7b72= Te6edf3DatabaseProviderTb4b4b4(Te6edf3_db_pathTb4b4b4)
Te6edf3DatabaseSchemaTb4b4b4(Te6edf3providerTb4b4b4)Tff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Te6edf3_db_pathTb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3old_ts Tff7b72= Te6edf3now Tff7b72- T79c0ff10 Tff7b72* T79c0ff86400
Te6edf3new_ts Tff7b72= Te6edf3now Tff7b72- T79c0ff86400
Te6edf3peer Tff7b72= Ta5d6ff"Ta5d6ffaTa5d6ff" Tff7b72* T79c0ff32
Te6edf3base Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Te6edf3peerTb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3peerTb4b4b4,
Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4: Te6edf3peerTb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: T79c0ff1.0Tb4b4b4,
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffephemeralTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_attemptsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnext_delivery_attempt_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffis_spamTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffreply_to_hashTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffattachments_strippedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}
Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Tb4b4b4{Tff7b72*Tff7b72*Te6edf3baseTb4b4b4, Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4, Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3old_tsTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Tb4b4b4{Tff7b72*Tff7b72*Te6edf3baseTb4b4b4, Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4, Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3new_tsTb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffINSERT INTO lxmf_conversation_read_state (destination_hash) VALUES (?)Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3n Tff7b72= Te6edf3lmrTff7b72.Td2a8ffapply_local_message_retentionTb4b4b4(
Te6edf3dbTff7b72.Td2a8ffmessagesTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3valueTff7b72=T79c0ff2Tb4b4b4,
Te6edf3unitTff7b72=Te6edf3lmrTff7b72.Td2a8ffUNIT_DAYSTb4b4b4,
Te6edf3nowTff7b72=Te6edf3nowTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3n Tff7b72== T79c0ff1
Tff7b72assert Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffcount_lxmf_messagesTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff1
Te6edf3left Tff7b72= Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT 1 AS ok FROM lxmf_messages WHERE hash = ?Ta5d6ff"Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffbTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4,Tb4b4b4)
Tb4b4b4)
Tff7b72assert Te6edf3left Tff7b72is Tff7b72not Tff7b72None
Te6edf3rs Tff7b72= Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT 1 AS ok FROM lxmf_conversation_read_state WHERE destination_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3rsTb4b4b4) Tff7b72== T79c0ff1
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Te6edf3providerTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_prune_clears_read_state_when_conversation_emptyTb4b4b4(Te6edf3_db_pathTb4b4b4)Tb4b4b4:
Te6edf3provider Tff7b72= Te6edf3DatabaseProviderTb4b4b4(Te6edf3_db_pathTb4b4b4)
Te6edf3DatabaseSchemaTb4b4b4(Te6edf3providerTb4b4b4)Tff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Te6edf3_db_pathTb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3peer Tff7b72= Ta5d6ff"Ta5d6ffcTa5d6ff" Tff7b72* T79c0ff32
Te6edf3h Tff7b72= Ta5d6ff"Ta5d6ffdTa5d6ff" Tff7b72* T79c0ff32
Te6edf3old_ts Tff7b72= Te6edf3now Tff7b72- T79c0ff3 Tff7b72* T79c0ff86400
Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3hTb4b4b4,
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Te6edf3peerTb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3peerTb4b4b4,
Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4: Te6edf3peerTb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdeliveredTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: T79c0ff1.0Tb4b4b4,
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffephemeralTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_attemptsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnext_delivery_attempt_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3old_tsTb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffis_spamTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffreply_to_hashTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffattachments_strippedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffINSERT INTO lxmf_conversation_read_state (destination_hash) VALUES (?)Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3lmrTff7b72.Td2a8ffapply_local_message_retentionTb4b4b4(
Te6edf3dbTff7b72.Td2a8ffmessagesTb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3valueTff7b72=T79c0ff1Tb4b4b4,
Te6edf3unitTff7b72=Te6edf3lmrTff7b72.Td2a8ffUNIT_DAYSTb4b4b4,
Te6edf3nowTff7b72=Te6edf3nowTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffcount_lxmf_messagesTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff0
Tff7b72assert Tb4b4b4(
Tffa657lenTb4b4b4(
Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT 1 AS x FROM lxmf_conversation_read_state WHERE destination_hash = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3peerTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72== T79c0ff0
Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Te6edf3providerTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


Tff7b72async Tff7b72def Td2a8fftest_config_patch_local_message_retention_keysTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fflocal_message_auto_delete_enabledTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6fflocal_message_auto_delete_valueTa5d6ff"Tb4b4b4: T79c0ff3Tb4b4b4,
Ta5d6ff"Ta5d6fflocal_message_auto_delete_unitTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffmonthsTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflocal_message_auto_delete_enabledTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflocal_message_auto_delete_valueTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff3
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflocal_message_auto_delete_unitTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmonthsTa5d6ff"
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fflocal_message_auto_delete_valueTa5d6ff"Tb4b4b4: T79c0ff9999Tb4b4b4,
Ta5d6ff"Ta5d6fflocal_message_auto_delete_unitTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffmonthsTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3mock_appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflocal_message_auto_delete_valueTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3lmrTff7b72.Td2a8ffMAX_VALUE_MONTHS


Tff7b72def Td2a8fftest_apply_calls_cancel_for_hex_hashesTb4b4b4(Te6edf3_db_pathTb4b4b4)Tb4b4b4:
Te6edf3provider Tff7b72= Te6edf3DatabaseProviderTb4b4b4(Te6edf3_db_pathTb4b4b4)
Te6edf3DatabaseSchemaTb4b4b4(Te6edf3providerTb4b4b4)Tff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Te6edf3_db_pathTb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3h Tff7b72= Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16
Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffupsert_lxmf_messageTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3hTb4b4b4,
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Te6edf3hTb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3hTb4b4b4,
Ta5d6ff"Ta5d6ffpeer_hashTa5d6ff"Tb4b4b4: Te6edf3hTb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsendingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffprogressTa5d6ff"Tb4b4b4: T79c0ff0.0Tb4b4b4,
Ta5d6ff"Ta5d6ffis_incomingTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffopportunisticTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdelivery_attemptsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnext_delivery_attempt_atTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3now Tff7b72- T79c0ff5 Tff7b72* T79c0ff86400Tb4b4b4,
Ta5d6ff"Ta5d6ffrssiTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffsnrTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffqualityTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffis_spamTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffreply_to_hashTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffattachments_strippedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3cancel Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3lmrTff7b72.Td2a8ffapply_local_message_retentionTb4b4b4(
Te6edf3dbTff7b72.Td2a8ffmessagesTb4b4b4,
Te6edf3cancelTb4b4b4,
Te6edf3valueTff7b72=T79c0ff1Tb4b4b4,
Te6edf3unitTff7b72=Ta5d6ff"Ta5d6ffdaysTa5d6ff"Tb4b4b4,
Te6edf3nowTff7b72=Te6edf3nowTb4b4b4,
Tb4b4b4)
Te6edf3cancelTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3dbTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffcount_lxmf_messagesTb4b4b4(Tb4b4b4) Tff7b72== T79c0ff0
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Te6edf3providerTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────